#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    
    closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);

    /////////////////////////////
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label
    
    auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);
    
    // position the label on the center of the screen
    label->setPosition(Vec2(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label->getContentSize().height));

    // add the label as a child to this layer
    this->addChild(label, 1);

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("HelloWorld.png");

    // position the sprite on the center of the screen
    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // add the sprite as a child to this layer
    this->addChild(sprite, 0);
    
    return true;
}


void HelloWorld::menuCloseCallback(Ref* pSender)
{
	connectServer();
}

// Socker连接
void HelloWorld::connectServer()
{
	// 初始化
	// ODSocket socket;
	socket.Init();
	socket.Create(AF_INET, SOCK_STREAM, 0);

	// 设置服务器的IP地址，端口号
	// 并连接服务器 Connect
	const char* ip = "127.0.0.1";
	int port = 30001;
	bool result = socket.Connect(ip, port);

	// 发送数据 Send
	socket.Send("login", 5);

	if (result) {
		CCLOG("connect to server success!");
		// 开启新线程，在子线程中，接收数据
		std::thread recvThread = std::thread(&HelloWorld::receiveData, this);
		recvThread.detach(); // 从主线程分离
	}
	else {
		CCLOG("can not connect to server");
		return;
	}
}

// 接收数据
void HelloWorld::receiveData()
{
	// 因为是强联网
	// 所以可以一直检测服务端是否有数据传来
	while (true) {
		// 接收数据 Recv
		char data[512] = "";
		int result = socket.Recv(data, 512, 0);
		printf("%d", result);
		// 与服务器的连接断开了
		if (result <= 0) break;

		CCLOG("%s", data);
	}
	// 关闭连接
	socket.Close();
}
